@@ -0,0 +1,59 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+# Generated by Django 1.11.29 on 2020-05-31 18:37 |
|
3 |
+from __future__ import unicode_literals |
|
4 |
+ |
|
5 |
+from django.db import migrations, models |
|
6 |
+ |
|
7 |
+ |
|
8 |
+class Migration(migrations.Migration): |
|
9 |
+ |
|
10 |
+ dependencies = [ |
|
11 |
+ ('account', '0045_userinfo_new_subscribe'), |
|
12 |
+ ] |
|
13 |
+ |
|
14 |
+ operations = [ |
|
15 |
+ migrations.AddField( |
|
16 |
+ model_name='userinfo', |
|
17 |
+ name='is_maintenance', |
|
18 |
+ field=models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u7ef4\u4fee\u5458', verbose_name='is_maintenance'), |
|
19 |
+ ), |
|
20 |
+ migrations.AddField( |
|
21 |
+ model_name='userinfo', |
|
22 |
+ name='userid', |
|
23 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u4f01\u4e1a\u5fae\u4fe1 userid', max_length=32, null=True, verbose_name='userid'), |
|
24 |
+ ), |
|
25 |
+ migrations.AlterField( |
|
26 |
+ model_name='userinfo', |
|
27 |
+ name='openid', |
|
28 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid'), |
|
29 |
+ ), |
|
30 |
+ migrations.AlterField( |
|
31 |
+ model_name='userinfo', |
|
32 |
+ name='openid_lensman', |
|
33 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_lensman'), |
|
34 |
+ ), |
|
35 |
+ migrations.AlterField( |
|
36 |
+ model_name='userinfo', |
|
37 |
+ name='openid_miniapp', |
|
38 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_miniapp'), |
|
39 |
+ ), |
|
40 |
+ migrations.AlterField( |
|
41 |
+ model_name='userinfo', |
|
42 |
+ name='openid_oauth', |
|
43 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_oauth'), |
|
44 |
+ ), |
|
45 |
+ migrations.AlterField( |
|
46 |
+ model_name='userinfo', |
|
47 |
+ name='openid_tourguide', |
|
48 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_tourguide'), |
|
49 |
+ ), |
|
50 |
+ migrations.AlterField( |
|
51 |
+ model_name='userinfo', |
|
52 |
+ name='user_from', |
|
53 |
+ field=models.IntegerField(choices=[(0, 'APP \u521b\u5efa\u7528\u6237'), (1, '\u5fae\u4fe1\u6388\u6743\u7528\u6237'), (8, '\u7528\u6237\u7aef\u7528\u6237'), (9, '\u6e38\u5ba2\u7528\u6237'), (10, '\u6444\u5f71\u5e08\u7aef\u7528\u6237'), (11, '\u5bfc\u6e38\u7aef\u7528\u6237'), (12, '\u5c0f\u7a0b\u5e8f\u7aef\u7528\u6237'), (22, '\u4f01\u4e1a\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7aef\u7528\u6237'), (13, '\u7f51\u9875\u6388\u6743\u7528\u6237')], default=0, help_text='\u7528\u6237\u6765\u6e90', verbose_name='user_from'), |
|
54 |
+ ), |
|
55 |
+ migrations.AlterUniqueTogether( |
|
56 |
+ name='userinfo', |
|
57 |
+ unique_together=set([('appid', 'userid')]), |
|
58 |
+ ), |
|
59 |
+ ] |
@@ -256,6 +256,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
256 | 256 |
LENSMAN_USER = 10 |
257 | 257 |
TOURGUIDE_USER = 11 |
258 | 258 |
MINIAPP_USER = 12 |
259 |
+ QYMINIAPP_USER = 22 |
|
259 | 260 |
OAUTH_USER = 13 |
260 | 261 |
|
261 | 262 |
USER_FROM = ( |
@@ -266,6 +267,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
266 | 267 |
(LENSMAN_USER, u'摄影师端用户'), |
267 | 268 |
(TOURGUIDE_USER, u'导游端用户'), |
268 | 269 |
(MINIAPP_USER, u'小程序端用户'), |
270 |
+ (QYMINIAPP_USER, u'企业微信小程序端用户'), |
|
269 | 271 |
(OAUTH_USER, u'网页授权用户'), |
270 | 272 |
) |
271 | 273 |
|
@@ -317,11 +319,13 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
317 | 319 |
# 微信授权用户 |
318 | 320 |
appid = models.CharField(_(u'appid'), max_length=32, blank=True, null=True, help_text=u'appId', db_index=True) |
319 | 321 |
unionid = models.CharField(_(u'unionid'), max_length=32, blank=True, null=True, help_text=u'微信 Unionid', db_index=True, unique=True) |
320 |
- openid = models.CharField(_(u'openid'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱用户端', db_index=True, unique=True) |
|
321 |
- openid_lensman = models.CharField(_(u'openid_lensman'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱摄影师端', db_index=True, unique=True) |
|
322 |
- openid_tourguide = models.CharField(_(u'openid_tourguide'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱导游端', db_index=True, unique=True) |
|
323 |
- openid_miniapp = models.CharField(_(u'openid_miniapp'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱小程序', db_index=True, unique=True) |
|
324 |
- openid_oauth = models.CharField(_(u'openid_oauth'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱用户授权', db_index=True, unique=True) |
|
322 |
+ openid = models.CharField(_(u'openid'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True) |
|
323 |
+ openid_lensman = models.CharField(_(u'openid_lensman'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True) |
|
324 |
+ openid_tourguide = models.CharField(_(u'openid_tourguide'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True) |
|
325 |
+ openid_miniapp = models.CharField(_(u'openid_miniapp'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True) |
|
326 |
+ openid_oauth = models.CharField(_(u'openid_oauth'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True) |
|
327 |
+ # 企业微信授权用户 |
|
328 |
+ userid = models.CharField(_(u'userid'), max_length=32, blank=True, null=True, help_text=u'企业微信 userid', db_index=True) |
|
325 | 329 |
# 用户基本信息 |
326 | 330 |
name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'用户姓名') |
327 | 331 |
sex = models.IntegerField(_(u'sex'), choices=SexModelMixin.SEX_TUPLE, default=SexModelMixin.UNKNOWN, help_text=u'用户性别') |
@@ -373,10 +377,17 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
373 | 377 |
shots_num = models.IntegerField(_(u'shots_num'), default=0, help_text=u'主持镜头数') |
374 | 378 |
level = models.IntegerField(_(u'level'), choices=LEVEL_TUPLE, default=MEMBER_NO, help_text=u'会员等级') |
375 | 379 |
|
380 |
+ # 维修员信息 |
|
381 |
+ is_maintenance = models.BooleanField(_(u'is_maintenance'), default=False, help_text=_(u'是否维修员'), db_index=True) |
|
382 |
+ |
|
376 | 383 |
class Meta: |
377 | 384 |
verbose_name = _(u'userinfo') |
378 | 385 |
verbose_name_plural = _(u'userinfo') |
379 | 386 |
|
387 |
+ unique_together = ( |
|
388 |
+ ('appid', 'userid'), |
|
389 |
+ ) |
|
390 |
+ |
|
380 | 391 |
def __unicode__(self): |
381 | 392 |
return unicode(self.pk) |
382 | 393 |
|
@@ -462,6 +473,8 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
462 | 473 |
'freeze_integral': self.freeze_integral, |
463 | 474 |
'shots_num': self.shots_num, |
464 | 475 |
'level': self.level, |
476 |
+ # 维修员信息 |
|
477 |
+ 'is_maintenance': self.is_maintenance, |
|
465 | 478 |
} |
466 | 479 |
|
467 | 480 |
@property |
@@ -163,7 +163,6 @@ def query_usercoupons(request): |
||
163 | 163 |
|
164 | 164 |
coupons = UserCouponInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-created_at') |
165 | 165 |
coupons = [coupon.admindata for coupon in coupons] |
166 |
- print coupons |
|
167 | 166 |
|
168 | 167 |
return response(200, 'User Coupon Success', u'用户劵列表获取成功', data={ |
169 | 168 |
'coupons': coupons, |
@@ -13,7 +13,7 @@ from group import (groupuser_views, lensman_views, tourguidegroup_views, tourgui |
||
13 | 13 |
tourguidegroupuser_views) |
14 | 14 |
from group import views as group_views |
15 | 15 |
from message import views as message_views |
16 |
-from miniapp import views as mini_views |
|
16 |
+from miniapp import views as mini_views, qy_views |
|
17 | 17 |
from operation import views as op_views |
18 | 18 |
from page import oauth_views, sale_views, screen_views |
19 | 19 |
from pay import views as pay_views |
@@ -184,6 +184,8 @@ urlpatterns += [ |
||
184 | 184 |
url(r'^mini/userinfo$', mini_views.get_userinfo_api, name='get_userinfo_api'), # 获取用户信息 |
185 | 185 |
url(r'^mini/login$', mini_views.mini_login_api, name='mini_login_api'), # 小程序登录 |
186 | 186 |
url(r'^mini/userinfo2$', mini_views.get_userinfo_api2, name='get_userinfo_api2'), # 获取用户信息 |
187 |
+ |
|
188 |
+ url(r'^qy/login$', qy_views.qy_login_api, name='qy_login_api'), # 小程序登录 |
|
187 | 189 |
] |
188 | 190 |
|
189 | 191 |
urlpatterns += [ |
@@ -440,6 +440,9 @@ COMPONENT_CALLBACK_CONFIG = { |
||
440 | 440 |
# 测试文件 |
441 | 441 |
TESTING_ZBAR = os.path.join(BASE_DIR, 'utils/zbar/zbar.jpg').replace('\\', '/') |
442 | 442 |
|
443 |
+# QY |
|
444 |
+QY_MAINTENANCE_USERID = [] |
|
445 |
+ |
|
443 | 446 |
# 开发调试相关配置 |
444 | 447 |
if DEBUG: |
445 | 448 |
try: |
@@ -0,0 +1,70 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+import logging |
|
4 |
+ |
|
5 |
+from django.conf import settings |
|
6 |
+from django.db import transaction |
|
7 |
+from django_curtail_uuid import CurtailUUID |
|
8 |
+from django_logit import logit |
|
9 |
+from django_response import response |
|
10 |
+from ipaddr import client_ip |
|
11 |
+from pyqywe_miniapp import get_userid |
|
12 |
+from pywe_storage import RedisStorage |
|
13 |
+from TimeConvert import TimeConvert as tc |
|
14 |
+ |
|
15 |
+from account.models import UserInfo |
|
16 |
+from statistic.models import RegisterStatisticInfo |
|
17 |
+from utils.error.errno_utils import ProductBrandStatusCode |
|
18 |
+from utils.redis.connect import r |
|
19 |
+from utils.redis.rprofile import set_profile_info |
|
20 |
+ |
|
21 |
+ |
|
22 |
+WECHAT = settings.WECHAT |
|
23 |
+logger = logging.getLogger('logit') |
|
24 |
+ |
|
25 |
+ |
|
26 |
+@logit(res=True) |
|
27 |
+@transaction.atomic |
|
28 |
+def qy_login_api(request): |
|
29 |
+ brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) |
|
30 |
+ appId = request.POST.get('appId', 'QYMINIAPP') |
|
31 |
+ |
|
32 |
+ if brand_id != settings.KODO_DEFAULT_BRAND_ID: |
|
33 |
+ return response(ProductBrandStatusCode.BRAND_NOT_MATCH) |
|
34 |
+ |
|
35 |
+ wxcfg = WECHAT.get(appId, {}) |
|
36 |
+ |
|
37 |
+ appid = wxcfg.get('appID') |
|
38 |
+ secret = wxcfg.get('appsecret') |
|
39 |
+ |
|
40 |
+ code = request.POST.get('code', '') |
|
41 |
+ |
|
42 |
+ userid = get_userid(appid=appid, secret=secret, code=code, storage=RedisStorage(r)) |
|
43 |
+ |
|
44 |
+ # Get or Create User |
|
45 |
+ user, created = UserInfo.objects.select_for_update().get_or_create(appid=appid, userid=userid) |
|
46 |
+ |
|
47 |
+ # Set User_id |
|
48 |
+ if created: |
|
49 |
+ user.user_id = CurtailUUID.uuid(UserInfo, 'user_id') |
|
50 |
+ # 注册用户统计 |
|
51 |
+ rsi, _ = RegisterStatisticInfo.objects.select_for_update().get_or_create( |
|
52 |
+ brand_id=brand_id, |
|
53 |
+ ymd=int(tc.local_string(format='%Y%m%d')), |
|
54 |
+ ) |
|
55 |
+ rsi.num += 1 |
|
56 |
+ rsi.save() |
|
57 |
+ |
|
58 |
+ # Set User Key's Value |
|
59 |
+ user.user_from = UserInfo.QYMINIAPP_USER |
|
60 |
+ user.appid = appid |
|
61 |
+ user.user_status = UserInfo.ACTIVATED |
|
62 |
+ user.signup_ip = client_ip(request) |
|
63 |
+ user.signup_at = tc.utc_datetime() |
|
64 |
+ user.is_maintenance = userid in settings.QY_MAINTENANCE_USERID |
|
65 |
+ user.save() |
|
66 |
+ |
|
67 |
+ # Store Userinfo |
|
68 |
+ set_profile_info(user) |
|
69 |
+ |
|
70 |
+ return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.brandata(brand_id=brand_id)) |